const express = require("express");
const boom = require("boom");
const userRouter = require("./user"); //处理 /user/info 路由
const bookRouter = require("./book"); //处理book路由
const { jwtAuth } = require("./jwt"); //处理 auth
const Result = require("../models/Result");

// 注册路由
const router = express.Router();
router.use(jwtAuth); // 对所有路由进行 jwt 认证

router.get("/", function (req, res) {
  res.send("欢迎学习小慕读书管理后台");
});

// 通过 userRouter 来处理 /user 路由，对路由处理进行解耦
router.use("/user", userRouter);
router.use("/book", bookRouter);
/**
 * 集中处理404请求的中间件
 * 注意：该中间件必须放在正常处理流程之后
 * 否则，会拦截正常请求
 */
router.use((req, res, next) => {
  next(boom.notFound("接口不存在"));
});

/**
 * 自定义路由异常处理中间件
 * 注意两点：
 * 第一，方法的参数不能减少
 * 第二，方法的必须放在路由最后
 */
router.use((err, req, res, next) => {
  console.log("route err:", err); //观察出错信息
  // 处理 token 错误
  if (err.name && err.name === "UnauthorizedError") {
    const { status = 401, message } = err; // 从err中获取数据
    new Result(null, "Token验证失败", {
      error: status,
      errorMsg: message,
    }).expired(res.status(status));
  } else {
    const msg = (err && err.message) || "系统错误";
    const statusCode = (err.output && err.output.statusCode) || 500;
    const errorMsg =
      (err.output && err.output.payload && err.output.payload.error) ||
      err.message;
    //处理其他错误
    new Result(null, msg, { error: statusCode, errorMsg }).fail(
      res.status(statusCode)
    );
    // res.status(statusCode).json({
    //   code: CODE_ERROR,
    //   msg,
    //   error: statusCode,
    //   errorMsg,
    // });
  }
});

module.exports = router;
